/**
 * @class Ext.ux.WizardForm
 * 向导表单
 * @param {Object} config
 * 
 */
Ext.ux.WizardForm=function(config){
	
	
	this.config=config;
	/**
	 * 提交表单的url
	 */
	this.url=this.config.url;
	/**
	 * true为上传表单，false为普通表单
	 * @type Boolean
	 */
	this.fileUpload=this.config.fileUpload||false;
    /**
     * 向导的子表单,类型为Ext.Panel的数组
     * @type	 	Array[Ext.Panel]
     */
    this.forms=this.config.forms;   
    /**
     * 标题
     * @type		String
     */
    this.title=this.config.title;
    /**
     * 高
     * @type		number
     */
    this.height=this.config.height||500;
    /**
     * 宽
     * @type		number
     */
    this.width=this.config.width;
    /**
     * 标题图片
     * @type	String
     */
    this.iconCls=this.config.iconCls||'';
    /**
     * @private activeItemIndex
     * 当前活动页的在表单数组中的索引
     */
    this.activeItemIndex=0;
    /**
     * @private isEnded
     */
    this.isEnded=false;
    this.isSignleForm=this.forms.length==1?true:false;
    /**
     * 
     * 第一步的按钮对象
     */
    this.firstButton=new Ext.Button({
    	id:'move-first',
		text:'第一步',
		iconCls:'x-tbar-page-first',
		handler:this.navBackHandler.createDelegate(this, [true]),
		disabled:true
    });
	/**
	 *
	 * 上一步的按钮对象
	 */
    this.prevButton=new Ext.Button({
		id:'move-prev',
		text:'上一步',
		iconCls:'x-tbar-page-prev',
		handler:this.navBackHandler.createDelegate(this,[false]),
		disabled:true
	});
	/**
	 * 下一步的按钮对象
	 */
	this.nextButton=new Ext.Button({
		id: 'move-next',
	    text: '下一步',
	    iconCls:'x-tbar-page-next',
	    disabled:this.isSignleForm,
	    handler: this.navForwardHandler.createDelegate(this,[false])
	});
	/**
     * 最后一步的按钮对象
     */
    this.lastButton=new Ext.Button({
    	id:'move-first',
		text:'最后一步',
		iconCls:'x-tbar-page-last',
		handler:this.navForwardHandler.createDelegate(this,[true]),
		disabled:true
    });
	/**
	 * 重置当前页按钮对象
	 */
	this.cancelActiveCardButton=new Ext.Button({
		id:'cancelActiveCard',
		text:'重置当前页',
		handler:this.cancelActiveCard.createDelegate(this)
	});
	/**
	 * 重置整个表单的按钮对象
	 */
	this.cancelAllCardButton=new Ext.Button({
		id:'cancelAllCard',
		text:'重置整个表单',
		handler:this.cancelAllCard.createDelegate(this)
	});
	/**
	 * 提交表单按钮对象
	 */
	this.submitButton=new Ext.Button({
		id:'submit',
		iconCls:'submit-image',
		text:'提交',
		handler:this.submit.createDelegate(this),
		disabled:!this.isSignleForm
	});
	/**
	 * 向导布局对象
	 */
	this.cardPanel=new Ext.Panel({
		id:'wizard',
		title:this.title,
		layout:'card',
		iconCls:this.iconCls,
		activeItem:this.activeItemIndex,
		height:this.height,
		width:this.width,
		defaults:{
			border:false
		},
		tbar:[
			this.firstButton,'-',
			this.prevButton,'-',
			this.nextButton,'-',
			this.lastButton,'->',
			this.cancelActiveCardButton,'-',
			this.cancelAllCardButton,'-',
			this.submitButton],
		items:this.forms
	});
	
	/**
	 * 提交数据的form表单
	 */
	this.mainForm=new Ext.FormPanel({
		region: 'center',
		fileUpload:this.fileUpload,
        items:[this.cardPanel]
	});
	
	/**
	 * 显示的布局对象
	 */
	this.viewport=new Ext.Viewport({
		layout:'border',
        items:[this.mainForm]
	});
}
Ext.ux.WizardForm.prototype={
	/**
	 * 向前导航的函数
	 * 此函数先判断此页的字段是否通过校验<br>
	 * 如果当前活动页时在第一步则启动第一步按钮和尚一步按钮<br>
	 * 如果参数isEnded为true,则关闭最后一步按钮和下一步按钮，并跳转早最后一步<br>
	 * 如果参数isEnded为false,则跳转到下一步<br>
	 * @param {Boolean} ieEnded		为true是使跳转到最后一页，false时是下一页
	 * 
	 */
	navForwardHandler:function(isEnded){
		if(!this.isActiveCardValid()){
			Ext.MessageBox.alert('消息：','有错误，请重新录入信息！');
			return ;
		}
		if(this.activeItemIndex==0){
			this.firstButton.setDisabled(false);
			this.prevButton.setDisabled(false);
		}
		
		if(isEnded){
			this.activeItemIndex=this.forms.length-1;
		}else{		
			this.activeItemIndex++;
		}
		
		if(this.activeItemIndex==this.forms.length-1){
			this.nextButton.setDisabled(true);
			this.lastButton.setDisabled(true);
			this.isEnded=true;
			this.submitButton.setDisabled(false);
		}
		
		this.cardPanel.layout.setActiveItem(this.activeItemIndex);
	},
	/**
	 * 向后导航的函数
	 * 次函数先判断是否有到过最后一步,并且当前页不是最后一页的时候才有检验当前活动页的表单数据<br>
	 * 如果当前活动页为最后一步,则启动下一步按钮和最后一步按钮<br>
	 * 如果isEnded为true,则关闭第一步按钮和上一步按钮,并跳转到第一步<br>
	 * 如果isEnded为false,则跳转到上一步 <br>
	 * @param {Boolean} isEnded		为true是使跳转到第一页，false时是最后一页
	 */
	navBackHandler:function(isEnded){
		if(this.isEnded&&!this.isActiveCardValid()){
			Ext.MessageBox.alert('消息：','有错误，请重新录入信息！');
			return ;
		}
		
		if(this.activeItemIndex==this.forms.length-1){			
			this.lastButton.setDisabled(false);
			this.nextButton.setDisabled(false);
		}		
		
		if(isEnded){
			this.activeItemIndex=0;
		}
		else{
			this.activeItemIndex--;
		}
		
		if(this.activeItemIndex==0){
			this.firstButton.setDisabled(true);
			this.prevButton.setDisabled(true);
		}
		
		this.cardPanel.layout.setActiveItem(this.activeItemIndex);
	},
	/**
	 * 校验当前活动页是字段是否通过校验
	 */
	isActiveCardValid:function(){
		var valid = true;
		var items=this.activeCardItems();
		for(var i=0;i<items.length;i++){
			if(!items[i].isValid()){
				valid=false;				
			}
		}
		return valid;
	},
	/**
	 * 重置当前活动页面的表单字段
	 */
	cancelActiveCard:function(){
		var items=this.activeCardItems();
		var valid=true;
		this.each(function(){
			this.reset();
		},items);
	},
	/**
	 * 重置整个表单的数据<br>
	 * 关闭第一步按钮、上一步按钮、最后一步按钮和提交按钮<br>
	 * 启动下一步按钮
	 * 设置isEnded值为false<br>
	 * 并跳转到第一步
	 */
	cancelAllCard:function(){
		this.mainForm.getForm().reset();
		this.firstButton.setDisabled(true);
		this.prevButton.setDisabled(true);
		this.lastButton.setDisabled(true);
		this.submitButton.setDisabled(true);
		this.nextButton.setDisabled(false);
		this.isEnded=false;
		this.activeItemIndex=0;
		this.cardPanel.layout.setActiveItem(this.activeItemIndex);
		
	},
	/**
	 * 获得当前活动页的表单字段
	 */
	activeCardItems:function(){
		return this.cardPanel.layout.activeItem.items.items;
	},
	/**
	 * 提交表单
	 */
	submit:function(){//start function按钮处理函数
		if(this.mainForm.getForm().isValid()){//表单是否通过交验，通过责提交表单，否则弹出错误窗口
			if (this.fileUpload) {
				Ext.ux.ProgressManager.start();
				this.mainForm.getForm().submit({
					fileUpload : this.fileUpload,
					url : this.url,
					success : function(form, action) {
						Ext.ux.ProgressManager.stop();
					},
					failure : function(form, action) {
						Ext.MessageBox.alert('有错误:', action.result.errors);
						Ext.ux.ProgressManager.stop();
					}
				});
			}else{
				this.mainForm.getForm().submit({
					waitMsg : '保存数据...',
					url : this.url,
					success : function(form, action) {
						Ext.MessageBox.alert('消息：', '保存成功');
					},
					failure : function(form, action) {
						Ext.MessageBox.alert('有错误:', action.result.errors);
					}
				});
			}
			
		}else{
			Ext.MessageBox.alert('消息：','有错误，请重新录入信息！');
		}
					
	},
	/**
	 * 内置循环实现函数方法
	 * @param	fn				子对象循环运行的函数
	 * @param	objs			要运行次函数的数组对象
	 * @param	scope			运行时上下文
	 */
	each:function(fn,objs,scope){
		for(var i=0,len=objs.length;i<len;i++){
			/**
			 * scope||objs[i]		表示此函数的上下文为scop，如果scope为空则为objs[i]
			 * objs[i]				为传入fn的参数
			 * this					表示把调用此each方法的对象做为输入参数
			 * i					为在数组中的位置
			 * 如果此函数有回返值为false则，跳出循环
			 */
			if(fn.call(scope || objs[i], objs[i], this, i) === false) {
                break;
            }
		}
	}
}